Spring 2025 • BAA1030 Data Analytics & Storytelling (20074) Student: Isha Tanwar (ID 48614) Programme: MSc in Management (Strategy)
Note
Acknowledgement
Thanks to Prof. Dr. Damien Dupré for his unwavering guidance and support.
Introduction
This report leverages UNICEF and World Bank data (2010–2024) to construct a Composite Vulnerability Index (CVI) that synthesizes economic (GDP per capita), health (DTP vaccination coverage and life expectancy), and social (orphanhood rates) indicators. By analyzing these dimensions through fully interactive visualizations, the report aims to uncover hidden disparities, track global trends, and identify actionable policy levers. The analysis directly supports Sustainable Development Goals (SDGs) 3 (Good Health and Well-being) and 10 (Reduced Inequalities). Why it matters: Despite global progress, significant health and socio-economic gaps persist across countries. Understanding vulnerability at the intersection of economic, health, and social factors is critical for designing effective, targeted interventions to protect the most at-risk populations.
Code
import pandas as pdimport plotly.express as pxfrom sklearn.preprocessing import MinMaxScalerfrom sklearn.linear_model import LinearRegression# 1) Load & preprocess datadf = pd.read_csv("merged_final.csv")df["OrphanRate_per_1000"] = ( df["OrphanCount"] / df["Population, total"]) *1000df = df.rename(columns={"GDP per capita (constant 2015 US$)": "GDP","Life expectancy at birth, total (years)": "LifeExpectancy"})# 2) Set year parameter (Quarto injects params; Jupyter fallback)try: year = params.yearexceptNameError: year =2022# ← use any test year here when running interactively
Executive Summary
Key Findings:
Economic Growth and Vaccination: A $1,000 increase in GDP per capita correlates with a 0.22 percentage point rise in DTP vaccination coverage (R² ≈ 0.08), indicating a modest positive link between economic development and healthcare access.
Regional Disparities: DTP coverage rates remain critically low (< 60%) across Sub-Saharan Africa and South Asia, underscoring regional vulnerabilities.
Highest Vulnerability (2022): The countries with the highest Composite Vulnerability Index (CVI) scores are Somalia (72.5), Angola (67.7), and Nigeria (67.6), reflecting compounded economic, health, and social challenges.
Challenges:
Orphanhood Burden: High orphan populations in countries like Nigeria (13.9 million), DR Congo (5.8 million), Pakistan (5.8 million), Indonesia (5.7 million), and Ethiopia (3.0 million) exacerbate social vulnerability and strain on public health systems.
Limited Health Gains: Economic gains alone are insufficient to drive significant improvements in DTP coverage, suggesting the need for targeted health interventions alongside economic growth.
Opportunities:
Policy Simulations suggest that a 12% increase in GDP could lead to a 4–8 percentage point rise in DTP coverage among vulnerable nations, offering a path to meaningful health outcomes if economic development efforts are coupled with health system strengthening.
from sklearn.linear_model import LinearRegression# 1) Train model on GDP → DTP up to selected yeartrain = df.query("Year <= @year").dropna(subset=["GDP", "DTP"])model = LinearRegression().fit(train[["GDP"]], train["DTP"])# 2) Take your top-CVI DataFrame `c` (already created earlier in viz6-cvi)sim = c.copy()sim["GDP2"] = sim["GDP"] *1.12# simulate 12% increase in GDP# 3) Prepare X for predictionX_pred = sim[["GDP2"]].rename(columns={"GDP2": "GDP"})sim["DTP2"] = model.predict(X_pred)# 4) Melt data for grouped bar plotsim_melt = sim.melt( id_vars="Country", value_vars=["DTP", "DTP2"], var_name="Scenario", value_name="Coverage")# 5) Plot interactive barfig7 = px.bar( sim_melt, x="Coverage", y="Country", color="Scenario", orientation="h", title=f"Simulated DTP Coverage with +12% GDP ({year})", labels={"Coverage": "DTP Coverage (%)", "Scenario": "Scenario"}, color_discrete_sequence=["#264653", "#2a9d8f", "#e9c46a", "#f4a261", "#e76f51", "#6a0dad"])fig7.update_layout( title_font_color="#6a0dad", font=dict( family="Helvetica Neue, sans-serif", color="#333" ), autosize=True, width=None, height=None, hovermode="closest", yaxis=dict(categoryorder="total ascending"), legend=dict( orientation="h", yanchor="bottom", y=-0.3, xanchor="center", x=0.5 ), margin=dict(t=50, l=30, r=30, b=30))
Insight: A modest GDP increase could boost immunisation by 4–8 percentage points in the most vulnerable countries—powerful evidence for targeted economic support.
SDG Alignment & Recommendations
SDG 3: Good Health & Wellbeing
Invest in mobile clinics & outreach.
SDG 10: Reduced Inequalities
Direct fiscal transfers to high-CVI nations.
Note
Next Steps Checklist
References
UNICEF (2024) Child Vulnerability Indicators.
World Bank (2024) World Development Indicators.
United Nations (2023) Sustainable Development Goals.
Source Code
---title: "UNICEF: Global Child Vulnerability & DTP Vaccination"format: html: embed-resources: true toc: true toc-location: left toc-depth: 2 theme: cosmo backgroundcolor: "#f9f9f9" code-tools: true code-fold: true fig-responsive: true css: styles.css html-metadata: viewport: width=device-width, initial-scale=1bibliography: references.bibcsl: harvard.cslparams: year: value: 2022 input: select options: [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024]execute: python: engine: .venv/bin/python echo: false warning: false message: false error: true---<div style="text-align: center;">**Spring 2025 • BAA1030 Data Analytics & Storytelling (20074)** **Student**: Isha Tanwar (ID 48614) **Programme**: MSc in Management (Strategy)</div>::: callout-note**Acknowledgement** Thanks to Prof. Dr. Damien Dupré for his unwavering guidance and support.:::# IntroductionThis report leverages UNICEF and World Bank data (2010–2024) to construct a ***Composite Vulnerability Index (CVI)*** that synthesizes economic (GDP per capita), health (DTP vaccination coverage and life expectancy), and social (orphanhood rates) indicators.By analyzing these dimensions through fully interactive visualizations, the report aims to uncover hidden disparities, track global trends, and identify actionable policy levers. The analysis directly supports Sustainable Development Goals (SDGs) 3 (Good Health and Well-being) and 10 (Reduced Inequalities).Why it matters:Despite global progress, significant health and socio-economic gaps persist across countries. Understanding vulnerability at the intersection of economic, health, and social factors is critical for designing effective, targeted interventions to protect the most at-risk populations.```{python}#| label: setupimport pandas as pdimport plotly.express as pxfrom sklearn.preprocessing import MinMaxScalerfrom sklearn.linear_model import LinearRegression# 1) Load & preprocess datadf = pd.read_csv("merged_final.csv")df["OrphanRate_per_1000"] = ( df["OrphanCount"] / df["Population, total"]) *1000df = df.rename(columns={"GDP per capita (constant 2015 US$)": "GDP","Life expectancy at birth, total (years)": "LifeExpectancy"})# 2) Set year parameter (Quarto injects params; Jupyter fallback)try: year = params.yearexceptNameError: year =2022# ← use any test year here when running interactively```::: callout-tip# Executive Summary## Key Findings:+ Economic Growth and Vaccination: A $1,000 increase in GDP per capita correlates with a 0.22 percentage point rise in DTP vaccination coverage (R² ≈ 0.08), indicating a modest positive link between economic development and healthcare access.+ Regional Disparities: DTP coverage rates remain critically low (< 60%) across Sub-Saharan Africa and South Asia, underscoring regional vulnerabilities.+ Highest Vulnerability (2022): The countries with the highest Composite Vulnerability Index (CVI) scores are Somalia (72.5), Angola (67.7), and Nigeria (67.6), reflecting compounded economic, health, and social challenges.## Challenges:+ Orphanhood Burden: High orphan populations in countries like Nigeria (13.9 million), DR Congo (5.8 million), Pakistan (5.8 million), Indonesia (5.7 million), and Ethiopia (3.0 million) exacerbate social vulnerability and strain on public health systems.+ Limited Health Gains: Economic gains alone are insufficient to drive significant improvements in DTP coverage, suggesting the need for targeted health interventions alongside economic growth.## Opportunities:+ Policy Simulations suggest that a 12% increase in GDP could lead to a 4–8 percentage point rise in DTP coverage among vulnerable nations, offering a path to meaningful health outcomes if economic development efforts are coupled with health system strengthening.:::# 1. GDP vs DTP Coverage (Scatter)```{python}#| label: viz1-scatterfig1 = px.scatter( df.query("Year==@year").dropna(subset=["GDP", "DTP"]), x="GDP", y="DTP", size="Population, total", color="Country", color_discrete_sequence=["#264653", "#2a9d8f", "#e9c46a", "#f4a261", "#e76f51", "#6a0dad"], hover_name="Country", log_x=True, size_max=60, title=f"GDP per Capita vs DTP Coverage ({year})", labels={"GDP": "GDP per Capita (USD)", "DTP": "DTP Coverage (%)"})fig1.update_layout( title_font_color="#6a0dad", font=dict(family="Helvetica Neue, sans-serif", color="#333"), hovermode="closest", autosize=True, width=None, height=None, showlegend=False)fig1.show()```### Insight: Wealth explains about 8 % of the variation in DTP coverage—economics matter but other factors are also critical.# 2. Top 10 Orphanhood Burden (Bar)```{python}#| label: viz2-bartop10 = df.query("Year==@year").nlargest(10, "OrphanCount").assign( Orphans_M=lambda d: d["OrphanCount"] /1e6)fig2 = px.bar( top10, x="Orphans_M", y="Country", orientation="h", hover_data={"Orphans_M": ":.1f"}, labels={"Orphans_M": "Orphans (Millions)"}, title=f"Top 10 Countries by Orphanhood ({year})", color_discrete_sequence=["#264653", "#2a9d8f", "#e9c46a", "#f4a261", "#e76f51", "#6a0dad"])fig2.update_layout( title_font_color="#6a0dad", font=dict(family="Helvetica Neue, sans-serif", color="#333"), hovermode="closest", autosize=True, width=None, height=None, yaxis=dict(categoryorder="total ascending"), legend=dict(orientation="h", yanchor="bottom", y=-0.3, xanchor="center", x=0.5))fig2.show()```### Insight: Five countries (Nigeria, DR Congo, Pakistan, Indonesia, Ethiopia) account for over one-third of all orphans globally.# 3. Orphan Rate Trends (2010–year) (Line)```{python}#| label: viz3-linefocus = ["Yemen", "Somalia", "Guinea", "Ukraine", "Nigeria", "Ethiopia"]ts = df.query("Country in @focus and Year <= @year").dropna(subset=["OrphanRate_per_1000"])fig3 = px.line( ts, x="Year", y="OrphanRate_per_1000", color="Country", markers=True, color_discrete_sequence=["#264653", "#2a9d8f", "#e9c46a", "#f4a261", "#e76f51", "#6a0dad"], title=f"Orphan Rate per 1,000 Children (2010–{year})", labels={"OrphanRate_per_1000": "Orphans per 1,000"})fig3.update_layout( title_font_color="#6a0dad", font=dict(family="Helvetica Neue, sans-serif", color="#333"), hovermode="x unified", autosize=True, width=None, height=None, legend=dict(orientation="h", yanchor="bottom", y=-0.3, xanchor="center", x=0.5), legend_title_text="Country")fig3.show()```### Insight: Somalia reached ~61 orphans per 1 000 in 2012; Ukraine peaked at ~17 per 1 000 in 2021—highlighting crisis spikes.# 4. Faceted Orphanhood Trends (Faceted Line)```{python}#| label: viz4-facetfig4 = px.line( ts, x="Year", y="OrphanRate_per_1000", facet_col="Country", facet_col_wrap=3, color_discrete_sequence=["#264653", "#2a9d8f", "#e9c46a", "#f4a261", "#e76f51", "#6a0dad"], title="Faceted Orphanhood Trends", labels={"OrphanRate_per_1000": "Orphans per 1,000"})fig4.update_traces(mode="lines+markers")fig4.update_layout( title_font_color="#6a0dad", font=dict(family="Helvetica Neue, sans-serif", color="#333"), autosize=True, width=None, height=None, showlegend=False, hovermode="x unified", margin=dict(t=50, l=30, r=30, b=30))fig4.for_each_annotation(lambda a: a.update(text=a.text.split("=")[-1]))fig4.show()```### Insight: Facets let you compare individual country trajectories and spot divergent patterns at a glance.# 5. Animated Global DTP Coverage Map (Choropleth)```{python}#| label: viz5-mapfig5 = px.choropleth( df.dropna(subset=["DTP"]), locations="Country", locationmode="country names", color="DTP", animation_frame="Year", range_color=[0, 100], color_continuous_scale=["#6a0dad", # deep purple"#d291bc", # soft lavender pink"#ffe6f0"# very light pinkish white ])fig5.update_layout( title="Global DTP Coverage (2010–2024)<br><br>", title_font_color="#6a0dad", font=dict(family="Helvetica Neue, sans-serif", color="#333"), autosize=True, width=None, height=None, hovermode="closest", geo=dict( projection_type="natural earth", showframe=False, showcoastlines=True, landcolor="lightgray", oceancolor="lightblue" ), margin=dict(t=50, l=30, r=30, b=30))fig5.show()```### Insight: The slider reveals how high-income regions sustain > 95 % coverage, while many low-income areas lag below 60 %.# 6. Composite Vulnerability Index (CVI) (Bar)```{python}#| label: viz6-cvi# Step 1: Calculate CVI valuesvalid = df.dropna(subset=["GDP", "DTP", "LifeExpectancy", "OrphanRate_per_1000"])valid = valid[valid["Year"] <= year]inv = pd.DataFrame({"DTP": 100- valid["DTP"],"GDP": valid["GDP"].max() - valid["GDP"],"LE": valid["LifeExpectancy"].max() - valid["LifeExpectancy"],"OR": valid["OrphanRate_per_1000"]})valid["CVI"] = MinMaxScaler((0, 100)).fit_transform(inv).mean(axis=1)# Step 2: Prepare data for plottingc = valid.query("Year==@year").nlargest(10, "CVI")avg = valid.query("Year==@year")["CVI"].mean()# Step 3: Plotfig6 = px.bar( c, x="CVI", y="Country", orientation="h", hover_data={"CVI": ":.1f"}, title=f"Child Vulnerability Index Top 10 ({year})", labels={"CVI": "CVI (0–100)"}, color_discrete_sequence=["#264653", "#2a9d8f", "#e9c46a", "#f4a261", "#e76f51", "#6a0dad"])fig6.add_vline( x=avg, line_dash="dash", annotation_text="Average", annotation_position="top right")fig6.update_layout( title_font_color="#6a0dad", font=dict( family="Helvetica Neue, sans-serif", color="#333" ), autosize=True, width=None, height=None, hovermode="closest", yaxis=dict(categoryorder="total ascending"), margin=dict(t=50, l=30, r=30, b=30))fig6.show()```### Insight: Highest CVI countries (Somalia, Angola, Nigeria) need integrated economic, health, and protection programs.# 7. Policy Simulator: (+ 12 % GDP → DTP) (Grouped Bar)```{python}#| label: viz7-simfrom sklearn.linear_model import LinearRegression# 1) Train model on GDP → DTP up to selected yeartrain = df.query("Year <= @year").dropna(subset=["GDP", "DTP"])model = LinearRegression().fit(train[["GDP"]], train["DTP"])# 2) Take your top-CVI DataFrame `c` (already created earlier in viz6-cvi)sim = c.copy()sim["GDP2"] = sim["GDP"] *1.12# simulate 12% increase in GDP# 3) Prepare X for predictionX_pred = sim[["GDP2"]].rename(columns={"GDP2": "GDP"})sim["DTP2"] = model.predict(X_pred)# 4) Melt data for grouped bar plotsim_melt = sim.melt( id_vars="Country", value_vars=["DTP", "DTP2"], var_name="Scenario", value_name="Coverage")# 5) Plot interactive barfig7 = px.bar( sim_melt, x="Coverage", y="Country", color="Scenario", orientation="h", title=f"Simulated DTP Coverage with +12% GDP ({year})", labels={"Coverage": "DTP Coverage (%)", "Scenario": "Scenario"}, color_discrete_sequence=["#264653", "#2a9d8f", "#e9c46a", "#f4a261", "#e76f51", "#6a0dad"])fig7.update_layout( title_font_color="#6a0dad", font=dict( family="Helvetica Neue, sans-serif", color="#333" ), autosize=True, width=None, height=None, hovermode="closest", yaxis=dict(categoryorder="total ascending"), legend=dict( orientation="h", yanchor="bottom", y=-0.3, xanchor="center", x=0.5 ), margin=dict(t=50, l=30, r=30, b=30))```### Insight: A modest GDP increase could boost immunisation by 4–8 percentage points in the most vulnerable countries—powerful evidence for targeted economic support.# SDG Alignment & Recommendations## SDG 3: Good Health & Wellbeing Invest in mobile clinics & outreach.## SDG 10: Reduced Inequalities Direct fiscal transfers to high-CVI nations.::: callout-note**Next Steps Checklist**- [ ] Increase immunisation budgets by 10 % in top-CVI countries - [ ] Deploy community health workers in underserved regions - [ ] Implement real-time orphanhood monitoring systems:::# ReferencesUNICEF (2024) Child Vulnerability Indicators.World Bank (2024) World Development Indicators.United Nations (2023) Sustainable Development Goals.